約 1,939,712 件
https://w.atwiki.jp/enowiki/pages/14.html
公式 リファレンス luaのライブラリ集 iPhoneに組み込む 参考にしたページ 手順 luaのソースコードをダウンロードするlua5.1 プロジェクトにソースコードを追加する("既存のファイルを追加"でプロジェクトに追加)※lua.cとluac.cファイルは除外しておく。 完了ビルドが正常に通る事を確認する。
https://w.atwiki.jp/tas_center/pages/12.html
由来は某学校を英語訳した時の頭文字を取ったもの。 別の意味としては T とっても A アクティブな S スクールライフ を応援する非公式学生団(のようなもの)と考えられている。 首謀者はTASを代表するゲーヲタ・S。 某学校内ではドM+ゲイのキャラを貫き通す恥さらし。 ↑本人も気にしていない 基本的な活動としては「電子娯楽」。 この四字熟語であるものを一瞬で想像出来ない人は希少価値です ぶっちゃけた話、青春を三次元で謳歌出来ない奴らが ゲームという架空の世界でうはwwwおkwwなノリで謳歌するという ちょっとお茶目なチームなんだな、これが。 ※1 構成員は主に帰宅部 ※2 男女比率=10 0(現状 構成員は皆様々な分野のスペシャリスト。 お互いが協力し合ってTASを支えているのだ。 というSの妄想だったのさ
https://w.atwiki.jp/kakis/pages/121.html
lua /// / ~さん。女性に対する敬称 \ 17 seren klel sid 「彼女」を意味する代名詞 \ [ ivi ] \ ~さん。女性に対する敬称 \
https://w.atwiki.jp/futoyama/pages/74.html
Luaというスクリプト言語がある。非常にコンパクトかつ高速に動作し、C/C++とも親和性がよいらしい。 ということで、Luaを初めてみる。 インストール Cygwin1.7.xへのインストール 参考Webサイト LuaからC言語の関数を呼び出す CからLuaを実行する。 バイナリダンプ(Hex dump) インストールしたはずのモジュールが見つからない場合 バイナリデータを文字列に変換してファイルに書きこむ インストール Linuxの場合はパッケージにあるので、aptやyumでインストールすればよいでしょう。 Linuxでソースからコンパイルする場合は、以下のようにする。 1)以下からソース用のtarballをダウンロードする。 http //www.lua.org/ftp/ 2)展開すると「INSTALL」というファイルがあるのでそれを一読する。 3) 「make linux」 を実行 linuxのところには、対象のプラットホームを名をいれれば、それに応じてメイクできる。 指定可能なものは以下のとおり。 $ make Please do make PLATFORM where PLATFORM is one of these aix ansi bsd freebsd generic linux macosx mingw posix solaris See INSTALL for complete instructions. 4) 「make install」 を実行するとインストール完了。 なお、デフォルトは”/usr/local”配下にインストールされます。別のところがよければ、以下のようにします。 $ make install INSTALL_TOP=xxx xxxにはインストール先のパスを指定 Cygwin1.7.xへのインストール Windowsでluaを使いたくなりCygwinにインストールしてみた。 http //lua-users.org/wiki/BuildingLua 上記にWindowsでのインストール方法が書いてあった。Cygwin以外もあったが、コンパイル環境を整えるのが面倒なので、インストール済みのCygwinにインストールしてみた。 ソースtarballを展開したら、以下の手順でインストールします。 1) src/Makefile に以下を追加 cygwin $(MAKE) "LUA_A=cyglua-5.1.dll" "LUA_T=lua.exe" \ "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ "MYCFLAGS=-DLUA_USE_LINUX -DLUA_BUILD_AS_DLL" \ "MYLIBS=-lreadline -lhistory" "MYLDFLAGS=-s" lua.exe 2) Makefile の以下にcygwinを追加 # Convenience platforms targets. PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris cygwin --これ 3) 「make cygwin」を実行 4) 「make install」を実行 5) cyglua-5.1.dll のコピー make installではcyglua-5.1.dllがパスのとおったところにインストールされない。 src/cyglua-5.1.dll をパスのとおっている /usr/local/lib にコピーして、インストール完了。 参考Webサイト 本家サイト http //www.lua.org/ lua-users wiki(サンプルがたくさんある) http //lua-users.org/wiki/ Lua5.1リファレンスマニュアル(日本語訳) http //sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html Lua文法最速マスター http //handasse.blogspot.com/2010/02/lua.html LuaからC言語の関数を呼び出す LuaからCの関数を利用するには、いくつかの決まりがあります。 1)Cの関数は以下のインターフェースで定義する。Luaから利用可能な関数をグルー関数と呼ぶ(LuaとCを糊付けするため)。 typedef int (*lua_CFunction) (lua_State *L); 2)グルー関数をLuaの関数として呼び出せるようにするため、以下の"luaL_Reg"構造体にグルー関数のポインタとLuaの関数名の対応を定義し、"luaL_register"関数でレジストする。 typedef struct luaL_Reg { const char *name; lua_CFunction func; } luaL_Reg; 3)luaL_register関数は以下のインターフェースの関数内に定義する。 int luaopen_ モジュール名 (lua_State *L) ※モジュール名のところをどうすべきかの説明が見つけられなかった。1)〜3)をすべて1つのCソースにして、その拡張子をとったものをモジュール名とすればOKだった。 4)Lua関数とグルー関数間の引数と戻り値の授受はLua独自のスタックを使用する。Lua関数に渡す引数は順に自動的にスタックに積まれ、グルー関数からはスタックのインデックス(第1引数がインデックス1、第2引数が2、・・・)で取得できる。グルー関数からの戻り値は、戻り値の型に応じた"lua_push*"関数によりスタックにpushすることで、Lua関数の戻り値として取得できる(複数pushすれば、複数の戻り値も取得できる)。 5)Luaがグルー関数の定義を探せるよう、グルー関数をダイナミックリンクライブラリにして、Luaスクリプトからrequire関数でリンクする。 以上を踏まえ、2つの数字を与えると掛け算の答えを出すmul関数と、2つの数字を与えるとその商と余りを出すdiv関数を例にして、そのグルー関数と、それを呼び出すためのLuaスクリプトを以下に示す。 a.C言語のグルー関数(calc.c) #include lua.h #include lualib.h #include lauxlib.h static int mul(lua_State * L) { int val1 = lua_tonumber(L, 1); /* 第1引数を数字としてスタックから取り出す */ int val2 = lua_tonumber(L, 2); /* 第2引数を数字としてスタックから取り出す */ lua_pushnumber(L, val1 * val2); /* 積をスタックに積む- 第1の戻り値 */ return 1; /* グルー関数の戻り値の数1を返却 */ } static int div(lua_State * L) { int val1 = lua_tonumber(L, 1); /* 第1引数を数字としてスタックから取り出す */ int val2 = lua_tonumber(L, 2); /* 第2引数を数字としてスタックから取り出す */ lua_pushnumber(L, val1 / val2); /* 商をスタックに積む- 第1の戻り値 */ lua_pushnumber(L, val1 % val2); /* 余りをスタックに積む- 第2の戻り値 */ return 2; /* グルー関数の戻り値の数2を返却 */ } /* lsleepモジュールに登録する関数のマッピング定義 */ static const struct luaL_reg calctable[] = { {"mul", mul}, {"div", div}, {NULL, NULL},/* 最後はダミー行が必要 */ }; /* lsleepモジュール初期化関数 */ int luaopen_calc(lua_State * L) { luaL_register(L, "calc", calctable); return 1; } b.Luaスクリプト(test.lua) require("calc")-- calc.soの動的リンク x = 8 y = 3 seki = calc.mul( x, y ) -- calcはレジストしたモジュール名 syou, amari = calc.div( x, y ) print(x .. " * " .. y .. " = " .. seki ) print(x .. " / " .. y .. " = " .. syou .. " ・・・ " .. amari ) 実行してみると、以下のとおり計算結果が得られる。 $ lua test.lua 8 * 3 = 24 8 / 3 = 2 ・・・ 2 【参考】Linuxでのダイナミックリンクライブラリ作成 以下のとおり、普通に作ればよい。Lua用のヘッダやライブラリをインストールしたパスを指定する必要がある。 gcc -shared -fPIC -o calc.so calc.c -L/opt/develop/lib -llua -I/opt/develop/include また、上記ではカレントにcalc.soを作成しているが、そのままだとLuaがcalc.soを見つけられないので、環境変数LUA_CPATHにカレントディレクトリを指定する必要がある。 export LUA_CPATH="./?.so" CからLuaを実行する。 CからLuaを実行する形態としては以下のものがある。 1)Luaのスクリプト全体を実行する。 2)CソースかかれたLuaの命令を実行する。 3)Luaスクリプトに書かれた関数を実行する。 ーー>Comming Soon!! バイナリダンプ(Hex dump) 指定されたデータを指定開始位置から指定終了位置までバイナリダンプ(ヘキサダンプ)する関数(hexdump)を作ってみた。 動作確認のため、コマンドライン引数で指定されたファイルをダンプするようにした。 以下のデータで実行すると、以下のように表示する。 $ cat test.dat 0123456789abcdef0--------------f $ lua hexdump.lua test.dat 00000000 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 0123456789abcdef 00000010 30 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 2D 66 0--------------f 00000020 0A $ lua hexdump.lua test.dat 10 15 00000009 39 61 62 63 64 65 9abcde ソース(hexdump.lua)は以下からどうぞ。 http //www35.atwiki.jp/futoyama?cmd=upload act=open pageid=74 file=hexdump.lua インストールしたはずのモジュールが見つからない場合 LuaでXML-RPCをためしてみるため、Lua XML-RPCをインストールした。ためしにアーカイブの付属サンプルを動かそうとしたら、以下のエラーがでた。 $ lua server_xavante.lua lua /mnt/work/develop/share/lua/5.1/xmlrpc/server.lua 11 module xmlrpc not found no field package.preload[ xmlrpc ] no file /mnt/work/develop/share/lua/5.1/xmlrpc.lua no file ./xmlrpc.lua no file /mnt/work/develop/lib/lua/5.1/xmlrpc.so no file ./xmlrpc.so stack traceback [C] in function require /mnt/work/develop/share/lua/5.1/xmlrpc/server.lua 11 in main chunk [C] in function require server_xavante.lua 6 in main chunk [C] ? Lua XML-RPCのソースは以下の3つだけであり、Luaソースのみで、Cなどのモジュールはない。インストールも環境変数LUA_PATHで指定されたところに「xmlrpc」ディレクトリを作成し、そこに3つのソースをコピーするだけ。 $ ls src http.lua init.lua server.lua しかしrequireコマンドは「xmlrpc.lua」を探そうとしてないのでエラーになっている。リファレンスマニュアル の「package.path」の説明を見ると「init.lua」の文字が見つかった。私のLuaはデフォルトとは別のパスにをインストールしており、package.pathを環境変数LUA_PATHで設定している。エラーの原因は、package.pathにinit.luaがもれているためだった。標準のパスでインストールされた環境のpackage.pathを見て、漏れているものを追加して、無事起動できた。 ■デフォルトのパスでインストールした環境 $ lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio print( package.path) ./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib64/lua/5.1/?.lua;/usr/lib64/lua/5.1/?/init.lua ■変更内容 export LUA_PATH="./?.lua;/mnt/work/develop/share/lua/5.1/?.lua;/mnt/work/develop/share/lua/5.1/?/init.lua" バイナリデータを文字列に変換してファイルに書きこむ file write(value1, ...) を使うと、ファイルにデータを書き込める。 リファレンスマニュアルによれば、引数(書きこむデータ)には文字列か数値を指定できるとあるので、数値を指定すればバイナリデータを書き込めるかと思いきや、数値を文字列にしたもの(1234は"1234")が書かれてしまう。 file writeのソース(liolib.cのg_write())を見ると、以下のとおりで、数値だとfprintf()を使い、文字列だとfwrite()を使っている。 if (lua_type(L, arg) == LUA_TNUMBER) { /* optimization could be done exactly as for strings */ status = status fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) 0; } else { size_t l; const char *s = luaL_checklstring(L, arg, l); status = status (fwrite(s, sizeof(char), l, f) == l); } Luaの文字列は `\0´ で表されるゼロを含み、いかなる8ビット値も含むことができるので、バイナリデータを文字列にすれば、バイナリデータをファイルに書くことができる。lua-users wikiにバイナリデータを文字列にするwite_format()が出ていた(以下に引用)。 -- Example -- write_format(true, "421", 0x12345678, 0x432931, 0x61) returns "xV4.1)a", -- a 7 bytes string whose characters are in hex 78 56 45 12 31 29 61 function write_format(little_endian, format, ...) local res = local values = {...} for i=1,#format do local size = tonumber(format sub(i,i)) local value = values[i] local str = "" for j=1,size do str = str .. string.char(value % 256) value = math.floor(value / 256) end if not little_endian then str = string.reverse(str) end res = res .. str end return res end これを使うと、以下のとおりバイナリデータをファイルにかける。 fh, msg = io.open( "testfile.bin", "wb" ) dat = write_format(true, "42",0x12345678, 0xabcd ) fh write2( dat ) fh flush() fh close() $ hexdump -C testfile.bin 00000000 78 56 34 12 cd ab |xV4...| 00000006 名前 コメント
https://w.atwiki.jp/koeiprogenitor/pages/13.html
エミュLUAの覚書き
https://w.atwiki.jp/mccc/pages/25.html
プログラミング言語Luaについての簡単なTIP 参考資料: Lua 5.1 リファレンスマニュアル Lua 5.1 Reference Manual 変数の型 コメント 制御構造 演算子優先順位 関係演算子 論理演算子orを使った変数の初期化 Cの三項演算子っぽい表記法 文字連結演算子 累乗演算子 長さ演算子 変数の型 変数はいかなる型の値も格納することができる。 数値と文字列は場所によって要求される型に自動変換されて渡される。1 + "2" は 3、 "a" .. 1 は "a1"。 変数の型を取得するには type(v) を使う。戻り値は変数vの型を表す文字列。 nil 変数の初期値。論理的にはfalseと同じく「偽」扱い。 boolean ブーリアン。真偽値。trueとfalse。 number 数値。実数値。精度はdouble。"0x"の16進数表記、"E"の指数表記も可。 string 文字列。""や 、[[]]で囲う。エスケープシーケンスはCと同じく\(バックスラッシュ)。 以下の4つのリテラルは同等 "test"\n123 "test"\ 123 "\"test\"\n123" [["test" 123]] function 関数。functionで定義される。 function foo(x) block end foo = function(x) block end 可変引数 ...を使うと不特定数の引数を取得可能。 function bar(...) local a, b = ... -- 可変引数を変数 a, b へ代入。bar(1,3) では a=1, b=3 になる。 local t = {...} -- 可変引数をテーブル型変数 t へ代入。bar(1,3)では t={1, 3}になる。 return ... -- 可変引数をそのまま戻り値として返す。bar(1,3)では 1, 3 が返る。 end table テーブル。連想配列。キーにはnilを除く任意の値を指定できる。 整数キーは1から始まる(0ではないので注意)。 t = { 0, name = "a", 1 } -- テーブル作成 t["name"] -- 値は a、 キー("name")は文字列 t.name -- 値は a、 キー("name")は文字列 t[1] -- 値は 0、 キー(1)は数値 t[2] -- 値は 1、 キー(2)は数値 thread スレッド。coroutineライブラリで使用。 userdata ユーザーデータ。プログラム作者が独自に実装したデータ形式 コメント -- そこから行末までがコメントになる。 --[[ 複数行のコメント ]] 制御構造 ループ構造の途中で抜けるにはbreakを使う。ただし、breakはendの直前である必要がある(単に"do break end"を挿入するだけでよい)。 while while exp do block end repeat repeat block until exp if if exp then block {elseif exp then block} [else block ] end for for Name = exp1 , exp2 [, exp3] do block end Nameがexp1からexp2になるまでexp3ずつ進む間くり返される。条件式の評価はループ開始前の1度だけ。 for key , value in pairs( table ) do block end tableのすべてのkey, valueについて繰り返す for key , value in ipairs( table ) do block end tableの整数keyを1から順番に最初にvalueにnilが表れるまで繰り返す for s1 , s2 , ... in string.gmatch( s , pattern ) do block end 文字列sからpatternに一致する文字列を検索しキャプチャされた文字列をs1, s2, ...に返すことを、一致する文字列がある限り繰り返す。キャプチャとはpatternにおいて"("と")"で挟まれた部分で、上の例ではpattern内で1番目のキャプチャ部分がs1に、2番目がs2に返る。キャプチャを省略すると一致部分全体を返す。 演算子 優先順位 ↑優先順位低 or and = = ~= == .. + - * / % not # - (符号) ^ ↓優先順位高 関係演算子 trueまたはfalseを返す。 == ~= = = == 文字列と数値の型変換は行われず、0 == "0" → false。 ~= a ~= b ⇔ not ( a == b )。 論理演算子 nilとfalseは偽、それ以外は真。 not not aで、aが真ならfalseが、aが偽ならtrueが返る。 and a and bで、aが真ならbの値が、aが偽ならaの値が返る。 or a or bで、aが真ならaの値が、aが偽ならbの値が返る。 orを使った変数の初期化 x = x or a 変数xが未初期化(nil)のときはorの性質により、xに初期値aが代入される。 xがnilでないときはxそのものが代入されるため、xは変化しない。 以下のように、関数の引数省略時のデフォルト値の設定としても使える。 function foo(_x) local x = _x or 10 end 上の例では、関数の引数(仮引数)_xが省略されたりnilが指定されたり(どちらも_xはnilとなる)したときは、デフォルト値(10)を変数xに代入し、_xに値が指定された時はそれをxに代入する。 Cの三項演算子っぽい表記法 result = exp and a or b ただし、aはfalseやnilを返さないこと。 expが真なら a or b となり上の条件よりaが真なのでaが返る。 偽なら exp or b となりexpが偽なのでbが返る。 文字連結演算子 文字連結演算子はドット二つ ..。右結合。 "Hello, " .. "world!" s .. t "Name " .. n 累乗演算子 ハット記号 ^。右結合。 x ^ n 長さ演算子 ナンバー記号 #。文字列の長さ(バイト単位)やテーブルの要素数を返す。 #t
https://w.atwiki.jp/cataclyj/pages/247.html
0.Dの頃に[[MOD]]用拡張言語としてLuaを使えていた時期がありますが、メンテナの都合で使用できなくなりました。 0.GよりEoCという外部拡張言語が使えるようになっていますが、まだModderにノウハウが溜まっていない状態です。 Luaを使用したMOD作成関連の情報を集約していきます。 執筆者随時募集中!気軽に追記してください。 Tips + 基本的な記述 地面のアイテムを取得する map_stackクラスとitem_stack_iteratorクラスを使う。 以下は隣接する床から人間の死体(human_flesh)を探すコード。 function get_item_on_floor(p) for delta_x = -1, 1 do for delta_y = -1, 1 do local tpoint = tripoint(p.x + delta_x, p.y + delta_y, p.z) local stack = map i_at(tpoint) local iter = stack cppbegin() while iter ~= stack cppend() do local tmp = iter elem() if tmp is_corpse() then if tmp get_mtype() get_meat_itype() == "human_flesh" then return tmp, tpoint end end iter inc() end end end return nil, nil end 弾薬タイプをstring型で取得する 以下のようにammotypeクラスのstr関数を使う。 これに限らず`string_id = "hogehoge"`のように定義されているクラスはstr関数でstring型の実体を取得することができる。 local at = it ammo_type() local at_string = at str() 足下の地形を取得する 名前の取得は以下のようにternameで可能。 local terrain_name = map tername(player pos()) idをstring型で取得するときは以下のようにterでter_idを取得し、そこからget_terrain_typeでter_tクラスを生成する必要がある。(ter_idの実体はint型のため) local terrain_int_id = map ter(player pos()) to_i() local terrain = game.get_terrain_type(terrain_int_id) local terrain_str_id = terrain.id str() 容器の容量を取得する get_remaining_capacity_for_liquidを使う。この関数は液体のアイテムが容器にあといくつ入るかを返す関数である。 同じ容積でも入れる液体によって返ってくる値は違うので注意すること。 (C++側にはget_container_capacityという関数があってそっちを使えば早いのだが、lua側には提供されてない) local tmp_container = item("bottle_plastic", 1) local tmp_liquid = item("water", 1) local capacity_in_250ml = tmp_container get_remaining_capacity_for_liquid(tmp_liquid, true)
https://w.atwiki.jp/tts-script/pages/13.html
■Luaとは TTSで採用されているプログラミング言語(スクリプト言語)。 TTS専用の言語ではないため、Luaの文法についてはTTSの解説サイトではなくても参考にしてよい。 ■TTS用API 上述の通りLuaはTTS専用の言語ではないため、そのままではTTS上のオブジェクトを扱えない。 そのため、TTS上の各機能をLuaで扱うためのAPI(専用の関数などをまとめたもの)が公開されている。 公式API https //api.tabletopsimulator.com/ つまり、TTSスクリプトでは通常のLuaの機能と公式APIの機能を組み合わせて記述していくことになる。
https://w.atwiki.jp/tasmark/pages/11.html
TASとはTiamet Antibotting Standardの略称です(無理くさいとか言わない)。 現在ラグナロクオンラインでは、BOTを始めとする不正ツールが健全なゲームプレイの妨げになっています。 そこで、”まずは各サーバー内からでもBOTを根絶しようではないか!”という経緯で立ち上げられたのが当ギルドです。 コンセプトは”BOTに負けない”。
https://w.atwiki.jp/tasdouga/pages/465.html
理論武装が出来た気がするので、TASを試作してみます 始める前に 一つ、便利なツールを用意します GOCHAさん作のツールで 指定したアドレスの数値をリアルタイムで確認できる という優れもの 今回は乱数を監視するのに使います http //tasvideos.org/forum/viewtopic.php?t=4466 に飛んでDownload Snes9x memory watcher rev.13でダウンロードします 詳しい使い方などはそのページを読んでもらうとして 今はとりあえず使える状態にできれば良いです 一度 memory watcher を起動して終了させます s9xwcnf0.txtとs9xwcnf1.txtが出来ているので開いて編集します s9xwcnf0.txt target snes9x.exe 70F1B0 0024 002C 0034 B165 B17C 72FDF4 という文字列を18行目に追加します s9xwcnf1.txt ;================================; FE Monshou;================================[SHVC FIREEMBLEM]7E046C,1u,ransuu を最後に挿入します 記録開始 File → Movie Record 設定 Recording StartRecord from reset Record ControllersJoypad 1 Misc.なんちゃら~というとこはよくわからんので置いときます 記録中に出来ること QS,QL(Shift+F1~F10でQS、F1~F10でQL) 一時停止(Pause) コマ送り(¥キー) 等など あえて挙げる必要もなく、通常時と変わらないようです QS,QLがいわゆる追記というものですね 今回はこの3つの機能しか使わないので 操作を覚えておきましょう 最速でスタートせよ ゲーム部分より前からTASとしての戦いが始まります 最速のタイミングでゲーム部分に行くために "どのフレームからボタンを押すと反応するのか"を調べます 適当なタイミングでQSし、 コマ送りで1フレームごとにボタンを押してみて しばらくフレームを送ってみて反応しているか見る 反応なしならQLしてやり直し という作業を繰り返していきます フレーム 操作 電源ON~163f 操作不能 164f スタート 226f スタート 281f A 313f A 409f A 495f A 530f スタート と操作するのが最速のようです ここから第一章 最速で会話せよ ボタン操作により、文字表示を早めることができるので それすなわち最速で操作しなければならないということです 先程と同じように調査していきます フレーム 操作 1796f A 1837f A 1893f A 1923f A 1981f A 1994f A 2011f A 2039f A 2056f A 2107f A 2122f A 2175f A 2192f A 2218f A 2235f A 2264f A 最速で設定せよ 設定にカーソルの速度というものがあります デフォルトでは「おそい」に設定されています 「はやい」に設定することで 画面スクロールの速度も変わる ので、欠かせない設定です 最速で設定しましょう フレーム 操作 2664f セレクト 2667f ↑ 2669f ↑ 2670f A 2671f ↑ 2672f A 2673f ↓ 2674f A 2675f B 2677f B キャラの上でもセレクトならメニューを開ける というのがミソです (ターン終了もセレクトから選びます) 具体的な進行プラン ここまでは準備期間であり ここからが本格的なプレイの部分となります あくまで試作なので 先の事を考えない最速パターン を考えてみましょう まず最短ターンでクリアするのに 最低2キャラ(内1キャラはマルス固定)必要です これはマルスが城に到達するのが最短で5ターン目であり、 その時ボスが倒されていなければならないからです なのでジェイガンとマルスを突っ込ませることにします 他キャラは必要ないし、移動する必要もないので 一切操作せずに済みそうです 蛇行せよ ターン開始直後はマルスにカーソルが合うようになっているので 必然的にマルスから動かします さて、↓の図を見てください これはマルスの初期配置からの移動範囲を示した物で 赤いラインは「カーソルを移動させる経路」です 見ての通り同じ目的地ですが、微妙に経路が異なっています どちらも最短に見えます しかし、実際に移動させるとAの方が1フレームだけ早く目的地に着きます これは 連続したフレームで同じ方向を入力すると「押しっぱなし」と判定される なので、押しっぱなしにしてもしばらく動かないからです 実際ゲームで操作してみればわかりますが どのゲームでも似たような処理になっているはずです 同じ方向に動かすには間に無入力のフレームを入れなければなりません これを踏まえてマルスを移動させます フレーム 操作 2679f A 2696f ← 2713f ← 2714f ↑ 2715f ← 2717f ← 2719f ← 2721f ← 2722f ↓ 2723f A 2797f A Yボタンは忘れよう 通常プレイでは便利なYボタン これはキャラ間のカーソル移動を楽にするもので 早く操作できそうな気がします が、フレーム単位でカーソルを操作するTASにとっては不要です 不要どころか使ったら遅くなります Yボタンで移動すると、しばらく操作不能の時間ができるので 押さない方が良いのです これを踏まえて、普通にカーソルを移動させます フレーム 操作 2812f → 2813f ↑ 2814f → 2816f → 2818f → 2819f A 主役の移動 ジェイガンを移動します マルスと同じように、なるべく早くカーソルを移動させましょう フレーム 操作 2838f ← 2855f ← 2857f ← 2859f ← 2861f ← 2862f ↓ 2863f ← 2864f ↓ 2865f ← 2869f ↓ 2870f ← 2874f A 2976f A 最速かつ最善 ターンを終了させます が、ここは最速でやればいいというものではありません 敵軍のターンで攻撃される場合、 ターン終了~敵の攻撃まで操作できないので 運命を操作するならここでやるしかありません まずは最速で終了して様子をみます それでダメなら乱数調整の出番です 今回のケースでは最速終了でおkでした フレーム 操作 2991f セレクト 2994f ↑ 2995f A 敵ターン 戦闘と乱数調整 初めての戦闘ですが 戦闘アニメは「ノーマル」にしています これは後々動画にした時の「動画としての見栄え」のためにです 最速を目指すなら問答無用で「オフ」にすべきところですが 問題もあります 「ノーマル」なら敵軍ターン中にも乱数調整がある程度可能ですが 「オフ」だと調整不能です 最初なので乱数も記載します 敵 自軍 命中 必殺 命中 必殺 108 251 138 025 ギリギリ必殺の025を引いて必殺しています 戦闘終了時に乱数調整のチャンスがあります フレーム 操作 5012f (最短) 5018f A 最短というのが本来最速のフレームですが 乱数調整のために操作を遅らせています 2戦目 6198f A(最短) 3戦目 7408f A(最短) 2戦目は運良く最短で必殺を引けました 4戦目はないので3戦目は何も考えずに最短でいきましょう 自軍 2ターン マルス、カーソル、ジェイガン、ターン終了 この辺から作業臭が漂ってきます フレーム 操作 マルス 8384f A 8401f ← 8418f ← 8419f ↓ 8420f ← 8421f ↓ 8422f ← 8424f ← 8426f ← 8427f A 8499f A カーソル 8514f → 8516f → 8517f A ジェイガン 8535f ← 8552f ← 8554f ← 8556f ← 8558f ← 8560f ← 8562f ← 8563f A 8624f A 8627f A 8630f (最短戦闘) 8639f A(必殺LVUPHP) 9335f A 9476f A ターン終了 9624f セレクト 9627f ↑ 9628f (最短) 9633f A 必殺LVUPHPについて せっかくなのでここで乱数調整して成長させてみます といっても ジェイガンで必殺を出してLVUPすると、HPしか上がる見込みがない(必殺率10の場合) というのが乱数表を見ればわかります 力は諦めてHPを上げときましょう 敵ターン 11114f (最短) 実はここはちゃんとメモされていませんでした ので後で確かめてみますが多分この最短フレームでAを押していると思います 自軍 3ターン マルス 11986f A 12003f ← 12020f ← 12021f ↓ 12022f ← 12023f ↓ 12024f ← 12026f ← 12028f ← 12029f A 12102f A カーソル 12117f ↑ 12118f → 12119f ↑ 12120f A ジェイガン 12138f ↓ 12155f ↓ 12156f ← 12157f ↓ 12158f ← 12160f ← 12161f ↑ 12162f ← 12164f ← 12168f ↑A 12261f A 12264f A 12267f (最短) 12280f A 13008f A ターン終了 13137f セレクト 13140f ↑ 13141f A(最短) だんだん表の作りがいい加減になって来ました 敵ターン 14434f (最短) 14436f A 15609f (最短) 15614f (当たって必殺) 15615f A(避けて必殺) 16976f A 16990f A(LVうp) 16992f A(何もあがらない場合の最速) 18167f A(最速) 当たって必殺、避けて必殺の乱数 092 235 122 009 152 039 182 069 212 099 242 129 235 122 009 152 039 182 069 212 099 242 129 上が当たっての場合 下が避けての場合です この乱数は1戦闘で処理さた乱数ですが 下では避けているために1つ数が少ないです 自軍 4ターン マルス 18434f A 18451f ← 18468f ← 18469f ↑ 18470f ← 18471f ↑ 18472f ← 18473f ↑A 18536f A カーソル 18551f ↓ 18552f ← 18553f A ジェイガン 18571f ↑(キャラが動く1f前) 18588f ↑(移動範囲が表示される1f前) 18589f ← 18593f ↑A 18629f A(メニューが表示される1f前) 18632f A 18635f A(最速) 19213f A(ボス会話 最後の文字から4f後) 19915f A(ゲージが伸びきるf) 19929f A(LVうp表示の2f前) 19931f A(何も上がらないので2f後に押すf LVうp表示f) 20105f (ボス死亡最後の文字f) 20109f A(ボス死亡最後の文字から4f後) ターン 20254f セレクト(カーソル表示fの2f前) 20256f (カーソル表示f) 20257f ↑(メニュー表示fの1f前) 20258f A(最速 メニュー表示f) 実際のプレイ時のメモ書きも載せています このターンのジェイガン操作から操作可能になるタイミングを 総当りではなく他の情報で判別しようとしています (調査段階なので全て総当りで進めていますが) 自軍 5ターン 20745f A(カーソル表示fの2f前) 20747f (カーソル表示f) 20762f ←(キャラが動く1f前) 20763f (キャラが動くf) 20779f ←(移動範囲表示fの1f前) 20780f (移動範囲表示f) 20783f ↑ 20784f ← 20788f ↑A 20832f ↓(メニュー表示fの1f前) 20833f A(メニュー表示f) 終了会話 20871f A(会話ウインドウ表示f) 20924f A(最後の文字表示fの1f後) 20941f A(文字fの6f前) 20947f (文字f) 20984f A(最後の1f後) 21001f A(文字fの6f前) 21007f (文字f) 21045f A(最後の1f後) 21062f A(文字fの6f前) 21068f (文字f) 21117f A(最後の1f後) 21134f A(文字fの6f前) 21140f (文字f) 21181f A(最後の1f後) 21198f A(文字fの6f前) 21204f (文字f) 21264f A 21281f A 21311f A 21328f A 21373f A 21390f A 21450f A 21467f A 21477f A 21494f A 21526f A ここの文字fというのは最速で操作しなかった場合に文字が表示されるフレームのことです 表の通りに操作すると文字fでは文字が表示されません セーブ 21552f B(ウインドウ表示fの1f前) 21553f (ウインドウ表示f) 21584f (セーブしない場合の背景フェードアウト開始f) 21595f (セーブする場合の背景フェードアウト開始f) 章最後に表示されるセーブウインドウです ここでセーブしてはいけません 表の通り、遅くなってしまいます 最後に 今回の試作では 「最速で操作したら必殺がでた」という状況が多く 比較的すんなりいけたと思います しかし、これは最速ではありません(アニメ「ノーマル」の件を抜きにしても) カーソル移動の最後のフレームで 十字キーとボタンを同時に入力して良い ということに途中で気づきました これで数フレーム変わると思います また、 戦闘後のメッセージ飛ばしをやっていない という致命的な欠陥があります 撮り終わってから気づきました 試作で気づいて良かったというべきでしょうか 一通り基本はやったと思うので 具体的な攻略プランを練るために、各MAPの調査プレイをやっていきます しかし、当方は何回かクリアしたことがある程度で やりこみプレイをしたこともなければ "第二部はクリアしたことない"という始末 なので、攻略のアイデアや「俺が協力してやんよ」みたいな人は大歓迎です 「基本はわかったから俺がTAS作ってやんよ」という人は更に歓迎です (このwikiのメンバー登録機能を使って連絡先を教えてくれれば共同で作業できると思います) ちょっとしたことでもいいので何かありましたら 各ページ下部にコメント欄がありますのでお気軽にどうぞ 又は、 SFC ファイアーエムブレム 紋章の謎 http //jbbs.livedoor.jp/bbs/read.cgi/game/44955/1216426976/ こちらへどうぞ 今回の試作TAS(smv) 章開始直後の全体見渡しもスキップできるよ。セレクトボタンは初耳だった - 2008-07-20 06 55 10 ああそれと、盗賊は封鎖したほうが早いと思う - 2008-07-20 07 02 27 見渡しスキップど忘れしていました 盗賊封鎖は参考になります ありがとうございました - 2008-07-20 09 19 02 封鎖するのが早いか倒すのが早いかは調べてないんで、これも調査かな? - 2008-07-20 09 55 22 戦闘に関してだけど、入力の手間を考えてもリアルにしたほうが戦闘アニメの時間が短いんじゃない?個別にして便宜切り替えが理想だが、これだと1ターンごとに調べないといけないのが・・・ - 2008-07-21 22 04 45